/* vuex 的 mutation 模块 : 直接更新状态 */

// 引入需要的常量信息
import Vue from 'vue'
import {
    RECEIVE_ADDRESS,
    RECEIVE_CATEGORYS,
    RECEIVE_SHOPS,
    RECEIVE_USER_INFO,
    RESET_USER_INFO,
    RECEIVE_INFO,
    RECEIVE_GOODS,
    RECEIVE_RATINGS,
    INCREMENT_FOOD_COUNT,
    DECREMENT_FOOD_COUNT,
    CLEAR_SHOP_CART,
    SEARCH_SHOP_KEYWORD
} from './mutation-types'

// 定义直接更新状态的方法
export default {
    // 接受地址信息
    [RECEIVE_ADDRESS](state, { address }) {
        state.address = address
    },
    // 接受分类信息
    [RECEIVE_CATEGORYS](state, { categorys }) {
        state.categorys = categorys
    },
    // 接受商家信息
    [RECEIVE_SHOPS](state, { shops }) {
        state.shops = shops
    },
    // 保存用户信息
    [RECEIVE_USER_INFO](state, { userInfo }) {
        state.userInfo = userInfo
    },
    // 重置用户信息
    [RESET_USER_INFO](state) {
        state.userInfo = {}
    },
    // 接受商家信息
    [RECEIVE_INFO](state, { info }) {
        state.info = info
    },
    // 接受商品列表
    [RECEIVE_GOODS](state, { goods }) {
        state.goods = goods
    },
    // 接受评论数组
    [RECEIVE_RATINGS](state, { ratings }) {
        state.ratings = ratings
    },

    // 购物车相关
    // 增加食品数量
    [INCREMENT_FOOD_COUNT](state, { food }) {
        // 如果是第一次添加, 没有对应的 count 属性
        if (!food.count) {
            // food.count = 1 
            // 添加 count 属性, 并指定为 1 // 问题: 新添加的属性没有数据劫持==>数据绑定==>更新了数据但界面不变
            Vue.set(food, 'count', 1)
            // 添加到购物车
            state.shopCart.push(food)
        } else {
            food.count++
        }
    },
    // 减少食品数量
    [DECREMENT_FOOD_COUNT](state, { food }) {
        if (food.count) {
            food.count--
            if (food.count === 0) {
                // 从购物车进行移除
                state.shopCart.splice(state.shopCart.indexOf(food), 1)
            }
        }
    },
    // 清空购物车的信息
    [CLEAR_SHOP_CART] (state) {
        // 将购物车中的所有引用
        state.shopCart.forEach(food => food.count = 0) 
        // 将数组中的引用置空
        state.shopCart = []
    },
    // 根据关键字搜索商家信息
    [SEARCH_SHOP_KEYWORD] (state , {searchShops}) {
        state.searchShops = searchShops
    }
}